Ext.define('AgenteNET.controller.Conexao', {
	extend : 'Ext.app.Controller',

	stores : [ 'Conexao' ],
	views :['MainLayer','MenuGlobal','Usuario','Login'],
	monitorTempo : 5000,
	conexaoTempo : 15,

	init : function() {
		this.control({
			'field' : {
				specialkey : function(field, event) {
					if (event.getKey() == Ext.EventObject.ENTER) {
						var win = field.up('window');
						var submit = win.down('button[type="submit"]');
						if(submit)
						   submit.fireEvent('click', submit, event);
					}
				}
			},
			'login' : {
				show : function(win) {
					var form = win.down('form');
					form.down('textfield[name="password"]').setValue();
					form.down('textfield[name="login"]').focus(true, 1500);
				}
			},
			'button' : {
				click : this.executarAcao
			},
			'menuitem' : {
				click : this.executarAcao
			},
			'grid' : {
				itemdblclick : function(){
					var a=arguments;
					a[0]=arguments[0].panel;
					this.executarAcao(a[0],a[1],a[2],a[3],a[4]);
				}
			},
			'filefield[cls="imagemField"]' : {
				render:function(el){
					el.up('panel').down('panel[cls="imagemFieldView"]').removeAll(true);
					el.up('panel').down('panel[cls="imagemFieldView"]').add({
						xtype:'image',
						width:91,
						height:66,
						src:el.up('form').getRecord().get('icone'),
					});
				},
				change:function(el){
					var file=el.getValue();
					console.log(el.getValue());
					el.up('panel').down('panel[cls="imagemFieldView"]').removeAll(true);
					el.up('panel').down('panel[cls="imagemFieldView"]').add({
						xtype:'image',
						width:91,
						height:66,
						src: file,
					});
				},
			},
		});
		this.monitorarConexao();
		this.inicializado = true;
	},
	historico:[],
	acaoAtual:null,
	executarAcao:function(el){
		var app = this.application, controller = this,acao=null;
		if (el.executar != undefined){
			acao=this.conexao.recursos().getAt(this.conexao.recursos().find('nome',el.executar));
			if(acao){
				this.carregarUtilidadesControle(acao);
				if(acao.get('controle')!='')
					controller = app.getController(acao.get('controle'));
				if (!controller.inicializado){
					controller.init();
					controller.inicializado = true;
				}
				if (acao.get('funcao') != ''){
					if (controller[acao.get('funcao')] != undefined) {
						if(acao.get('view')=='C'){
							Ext.getCmp('WorkLayer').removeAll(true);
							Ext.getCmp('WorkLayer').add({
								title:acao.get('titulo'),
								alias:acao.get('nome'),
								frame : true,
								border : false,
								chamadoPor:el,
								acao:acao,
								items:Ext.Function.bind(controller[acao.get('funcao')], controller,arguments)(),
								margin : '10 10 10 10',
								padding : '0 0 0 0 ',
								region : 'center',
								xtype:'panel',
								layout:'fit',
							});
							return true;
						}
						if(acao.get('view')=='J'){
							var animateTarget=null;
							for(i in arguments)if(arguments[i].$className=='Ext.EventObjectImpl')animateTarget=arguments[i].target;
							var cmp=Ext.Function.bind(controller[acao.get('funcao')], controller,arguments)();
							cmp.getDockedItems('toolbar')[0].add({
								text : 'Fechar',
								controle : 'Conexao',
								acao : 'Fechar',
							});
							var win=Ext.create('Ext.window.Window',{
								title:acao.get('titulo'),
								alias:acao.get('nome'),
								chamadoPor:el,
								items:cmp,
								acao:acao,
								closable : true,
								layout : 'fit',
								resizable:false,
								closeAction : 'destroy',
								animateTarget: animateTarget,
								border:false,
								//autoShow:true,
								layout:'fit'
							});
							Ext.getCmp('WorkLayer').add(win);
							win.show();
							return true;
						}
						Ext.Function.bind(controller[acao.get('funcao')], controller,arguments)();
					}else{
						console.log('Funcao "'+acao.get('funcao')+'" nao encontrada no controle "'+acao.get('controle')+'"');
					}
				}
			}
		}else if(el.acao != undefined || el.controle != undefined){
			if (el.controle != undefined)
				controller = app.getController(el.controle);
			if (!controller.inicializado)
				controller.init();
			if (el.acao != undefined)
				if (controller[el.acao] != undefined) {
					Ext.Function.bind(controller[el.acao], controller,
							arguments)();
				}
		}
	},
	Fechar:function(el){
	    if(el)if(el.up)if(el.up('window'))el.up('window').close();
	    this.acaoAtual=null;
	    if(el.up('panel[chamadoPor]'))
	    	if(el.up('panel[chamadoPor]').chamadoPor)
	    		if(el.up('panel[chamadoPor]').chamadoPor.up('panel[chamadoPor]'))
	    			if(el.up('panel[chamadoPor]').chamadoPor.up('panel[chamadoPor]').acao)
	    				this.carregarUtilidadesControle(el.up('panel[chamadoPor]').chamadoPor.up('panel[chamadoPor]').acao);
	},
	
	carregarUtilidadesControle:function(acao){
		
		var menu=[],recursos=null,layerControl=null,menuControle=null,menuLayer=null;
		if (recursos = this.conexao.recursos()) {
			for (i in recursos.data.items) {
				if(recursos.data.items[i].get('primario')==acao.get('id')&&recursos.data.items[i].get('dependente')=='N'){
					menu[menu.length]={
						recurso : recursos.data.items[i],
						app : this.application,
						text : recursos.data.items[i].get('rotulo'),
						icon : recursos.data.items[i].get('icone'),
						executar:recursos.data.items[i].get('nome'),
					};
				}
			}
		}

		menuControle = Ext.getCmp('menuControle');
		if(menu.length>0){
			menuLayer=Ext.getCmp('menuControlerLayer');
			menuLayer.removeAll(true);
			menuLayer.add(menu);
			menuControle.show();
		}else{
			menuControle.hide();
		}
			
		infoControle = Ext.getCmp('infoControle');
		infoControle.removeAll(true);
		videoControle = Ext.getCmp('videoControle');
		videoControle.removeAll(true);
		
		if(this.acaoAtual!=acao.get('id')){
			this.acaoAtual=acao.get('id');
			if(acao.get('descricao')!=''){
				infoControle.add({frame:false,border:false,items:{frame:false,border:false,padding : '10 10 10 10',html:acao.get('descricao')}});
				infoControle.show();
			}else{
				infoControle.hide();
			}
			if(acao.get('video')!=''){
				videoControle.add({frame:false,border:false,items:{
					html:  '<iframe width="255" height="180" src="http://www.youtube.com/embed/'+acao.get('video')+'?version=2&fs=1&autoplay=1" frameborder="0" allowfullscreen></iframe>',
					width:270,
					height:200,
					margin : '0 0 0 0',
					padding : '10 10 10 10',
				}});
				videoControle.show();
			}else{
				videoControle.hide();
			}
		}
		
	},

	login : null,
	conexao:null,
	monitorarConexao : function() {
		var token = Ext.util.Cookies.get('token');
		if (token) {
			this.getConexaoStore().model.load(token, {
				scope : this,
				success : function(model, op) {
					this.atualizarMainLayer(model);
					if (this.login) {
						this.login.destroy();
						this.login = null;
					}
					this.conexao=model;
					Ext.defer(this.monitorarConexao, this.monitorTempo * 1000,
							this);
				},
				failure : function(model, op) {
					if (op.error) {
						if (op.error.status == 0) {
							alert('Não foi possivel acessar o servidor '
									+ 'para solicitar a autenticação');
						} else if (op.error.status == 404) {
							alert('Foi possível solicitar '
									+ 'a autenticação do usuário');
						} else if (op.error.status == 403) {
							alert(op.error.msg);
							if (!this.login)
								this.login = Ext.create('AgenteNET.view.Login');
						} else {
							alert(op.error);
						}
					}
					this.conexao=null;
					this.atualizarMainLayer();
				}
			});
		} else {
			this.Login();
			this.atualizarMainLayer();
		}
	},
	Login:function(){
		Ext.util.Cookies.clear('token');
		if (!this.login)
			this.login = Ext.create('AgenteNET.view.Login');
		return this.login;
	},

	solicitarAutenticacao : function(el) {
		var win = el.up('window');
		var form = win.down('form').getForm();
		if (!form.isValid()) {
			return false;
		}
		var data = form.getValues();
		var model = this.getConexaoStore().model;
		var log = model.create(data);
		log.save({
			scope : this,
			win : win,
			success : function(model, op) {
				this.conectar(model);
				op.win.close();
			},
			failure : function(model, op) {
				if (op.error) {
					if (op.error.status == 0) {
						alert('Não foi possivel acessar o servidor '
								+ 'para solicitar a autenticação');
					} else if (op.error.status == 404) {
						alert('Foi possível solicitar '
								+ 'a autenticação do usuário');
					} else if (op.error.status == 403) {
						alert(op.error.msg);
					} else {
						alert(op.error);
					}
				}
				op.win.fireEvent('show', op.win);
			}
		});
		return model;
	},

	conectar : function(model) {
		var expiry = new Date();
		expiry.setTime(expiry.getTime() + (this.tempoConexao * 1000));
		Ext.util.Cookies.set('token', model.get('token'), expiry);
		this.monitorarConexao();
		return this.conexao;
	},
	desconectar : function() {
		Ext.util.Cookies.clear('token');
		this.monitorarConexao();
		return this.conexao;
	},

	mainLayer : null,
	userview : null,
	atualizarMainLayer : function(conexao) {
		this.conexao=conexao;
		var main = null, menu = null, layerUser = null;
		if (!this.mainLayer) {
			this.mainLayer = Ext.create('AgenteNET.view.MainLayer');
		}
		main = this.mainLayer;
		menu = main.down('menuGlobal');
		menu.removeAll(true);
		layerUser = Ext.getCmp('UserLayer');
		if (conexao) {
			if (recursos = conexao.recursos()) {
				for (i in recursos.data.items) {
					if(recursos.data.items[i].get('primario')==1&&recursos.data.items[i].get('dependente')=='N'){
						menu.add({
							recurso : recursos.data.items[i],
							app : this.application,
							text : recursos.data.items[i].get('rotulo'),
							icon : recursos.data.items[i].get('icone'),
							executar:recursos.data.items[i].get('nome'),
						});
					}
				}
			}
			menu.add([ '->', {
				text : 'Sair',
				acao : 'desconectar'
			} ]);
			if (!this.userview) {
				layerUser.removeAll(true);
				this.userview = layerUser.add(Ext
						.create('AgenteNET.view.Usuario'));
				this.userview.down('image').setSrc(
						'tema/default/images/fotoUsuario.jpg');
				this.userview.down('text[id="usuarioNome"]').setText(
						conexao.get('usuario'));
				this.userview.down('text[id="usuarioIp"]').setText(
						conexao.get('ip'));
				+conexao.get('ip');
			}

			if(!this.InicializacaoAplicativo){
				this.InicializacaoAplicativo=true;
				if (ExecutarFuncao) {
					this.executarAcao({executar:ExecutarFuncao});
				}
			}
		
		} else {
			if (this.userview)
				this.userview.destroy();
			this.userview = null;
			layerUser.removeAll(true);
		}
	},

});
